package hr.ctg.domain.model;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.validator.NotNull;

@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name = "vrijeme")
@NamedQueries( {
		@NamedQuery(name = "Vrijeme.findByMjestoVrObj", query = "select v from Vrijeme v where v.mjesto = ? and vrijemeObjave = ?"),
		@NamedQuery(name = "Vrijeme.findLastByNazivMjesta", query = "select distinct v from Vrijeme v where v.mjesto.naziv = ? and vrijemeObjave = (select max(v1.vrijemeObjave) from Vrijeme v1 where v1.mjesto.idMjesta = v.mjesto.idMjesta)"),
		@NamedQuery(name = "Vrijeme.findLastByIdMjesta", query = "select distinct v from Vrijeme v where v.mjesto.idMjesta = ?") })
public class Vrijeme implements Serializable {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "id_vremena")
	private Integer idVremena;

	@Column(name = "temperatura_zraka")
	private Float temperaturaZraka;

	@Column(name = "relativna_vlaznost")
	private Float relativnaVlaznost;

	@Column(name = "brzina_vjetra")
	private Float brzinaVjetra;

	@Column(name = "smjer_vjetra")
	private String smjerVjetra;

	@Column(name = "tlak_zraka")
	private Float tlakZraka;

	@Column(name = "temperatura_mora")
	private Float temperaturaMora;

	@Column(name = "izlazak_sunca")
	private Date izlazakSunca;

	@Column(name = "zalazak_sunca")
	private Date zalazakSunca;

	@Column(name = "vrijeme_objave")
	private Date vrijemeObjave;

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_mjesta", nullable = false)
	@NotNull
	private Mjesto mjesto;

	private String opis;

	private String kod;

	private static final long serialVersionUID = 1L;

	public Vrijeme() {
		super();
	}

	public int getIdVremena() {
		return idVremena;
	}

	public void setIdVremena(final Integer idVremena) {
		this.idVremena = idVremena;
	}

	public Float getTemperaturaZraka() {
		return temperaturaZraka;
	}

	public void setTemperaturaZraka(final Float temperaturaZraka) {
		this.temperaturaZraka = temperaturaZraka;
	}

	public Float getRelativnaVlaznost() {
		return relativnaVlaznost;
	}

	public void setRelativnaVlaznost(final Float relativnaVlaznost) {
		this.relativnaVlaznost = relativnaVlaznost;
	}

	public Float getBrzinaVjetra() {
		return brzinaVjetra;
	}

	public void setBrzinaVjetra(final Float brzinaVjetra) {
		this.brzinaVjetra = brzinaVjetra;
	}

	public String getSmjerVjetra() {
		return smjerVjetra;
	}

	public void setSmjerVjetra(final String smjerVjetra) {
		this.smjerVjetra = smjerVjetra;
	}

	public Float getTlakZraka() {
		return tlakZraka;
	}

	public void setTlakZraka(final Float tlakZraka) {
		this.tlakZraka = tlakZraka;
	}

	public Float getTemperaturaMora() {
		return temperaturaMora;
	}

	public void setTemperaturaMora(final Float temperaturaMora) {
		this.temperaturaMora = temperaturaMora;
	}

	public Date getIzlazakSunca() {
		return izlazakSunca;
	}

	public void setIzlazakSunca(final Date izlazakSunca) {
		this.izlazakSunca = izlazakSunca;
	}

	public Date getZalazakSunca() {
		return zalazakSunca;
	}

	public void setZalazakSunca(final Date zalazakSunca) {
		this.zalazakSunca = zalazakSunca;
	}

	public Date getVrijemeObjave() {
		return vrijemeObjave;
	}

	public void setVrijemeObjave(final Date vrijemeObjave) {
		this.vrijemeObjave = vrijemeObjave;
	}

	public String getOpis() {
		return opis;
	}

	public void setOpis(final String opis) {
		this.opis = opis;
	}

	public String getKod() {
		return kod;
	}

	public void setKod(final String kod) {
		this.kod = kod;
	}

	public Mjesto getMjesto() {
		return mjesto;
	}

	public void setMjesto(final Mjesto mjesto) {
		this.mjesto = mjesto;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ (idVremena == null ? 0 : idVremena.hashCode());
		return result;
	}

	@Override
	public boolean equals(final Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		final Vrijeme other = (Vrijeme) obj;
		if (idVremena == null) {
			if (other.idVremena != null) {
				return false;
			}
		} else if (!idVremena.equals(other.idVremena)) {
			return false;
		}
		return true;
	}

}
